Clase Analisis y Presentacion de Datos

Determinacion de punto de la influencia de los enlaces de carbono en el punto de fusion

Suponemos que la cantidad de enlaces dobles en una molecula tiene una relacion directa con el punto de fusion de la sustancia. El problema, es que por ahora, datos no tenemos, asi que vamos a tener que armarlos nosotros.

Para este caso, vamos a suponer que los datos de las moleculas estan en formato SMILES Simplified Molecular- Input Line-Entry System. Esta notacion ademas de poder ser cargada desde y hacia archivos de texto plano facilmente, e incluso hay bibliotecas para trabajar sobre ello como RdKit


In [1]:
tabla = []

In [2]:
ATOMOS = ["B","C","N","O","P","S","F","I","Br","Cl"]

In [3]:
ENLACES = ["","=","#"] #Simples, dobles o triples

In [4]:
import random

In [5]:
for _ in range(10000):
    temperatura = random.randint(0,473)
    
    molecula = []
    for _ in range( random.randint(0,600)):
        molecula.append(random.choice(ATOMOS))
        molecula.append(random.choice(ENLACES))
    molecula.append(random.choice(ATOMOS))
    
    molecula = "".join(molecula)
    tabla.append( (molecula,temperatura) )

In [6]:
tabla[:3]


Out[6]:
[('B#BNO#P#F#O#N=SCIBrS=PN=P#N#S=C#O#P#N#FSP#N=Br#Cl#BrNO=F#P#O=F=I#S#Cl#Cl=O=IBr=BP=N=FNIBr=S=CClB=I=P#BrF#C#O=C=N=Cl=BrO=NB#S#S#B=SCO#P=CB=P=S#N=N#B#BrC#O=P=N=INB#S',
  8),
 ('Br=C#BP=ClOS#F#I=N#N#SClCl#ClBrSNCl=BNC=F#NS=B=SBr=FNNFBr#O=NP=N=FB#I=Cl#ClN#NSBr#P#CS=CS=C=C=P#SP=ClCl#O#SI#Br=S#IBr#NI#CS#O=Cl#Cl#BrO=Cl#O#Cl#I=F=Cl#NCO=Br=OC=O#N#Cl=O#PP=PFO#OP=NS#P#O#N=S#C#C=I#P=F#Br#N#P=S=I#CN=C=Br=P=BrFCl#BN#BBrP=Cl#OC#FCS=BClN=F#I#S=I=C#N=SBS=NClN=Br=SF=P=B#BrB#SF#B#O#BO=N=FO=NB=O#P#O#Br=NCBF#FCl#SF=IO=B=ON#BS=N#B=PC#N#N#N=Br#B=C#B#O#ClI=S=B=S#SF=N#FB#P#ClI=BrClNOBSBClI#BrP#O#N=SO#P=PN=O=Cl=F#B#BP=Cl#N=P=NF#BP#I#ClN#FB=P=F=B=Cl=S#Cl=P=OI#P=BrB=PINCl=C=I=S#I#IB#ClBr#P=B#N=NS#CF=B=ClF=Cl=CBrI=O=SO#F=I=Br=OO=O=FO=ClIBBr#F=F=N=P=I#N=P#N#O=Br=P=PF=PB#S#F#N=N=CB=O=O#ClS#Br=III#N=Br#C=Br=Cl=OS#IO#F#O#NB=F#CB#B=CBBr=Br#P#SF#O#OB=B#C#Br=BCl=I=S=P=N#C#PB#F=SClBr=SCl=N#P#C#P=OB=PCO=F=S=I=B=C#O=O=B#C=OF=P=F=Cl=F=BrBr#S=IPO#BBrCS#CClB#O#CO#I=IFP=I=Cl=ClNF#B=B=BrOCl#Br#Cl#Cl=BrS=OO#N#Cl=O#Cl#O#B=P#O#Br=O#P#FI=B#I#O=S#CO#ClF=CCl#I#P=C#N=F#ClF=FIBS=S=BrBr#Br#SBS#O#F#N=O#OB#B#Br#NBN=B#I#S#S#N=P#P',
  314),
 ('F=N=S=C=Cl#O=Br=P#O=P#Cl#CB#NB#BN#O=BrC#Br=N#I=SPBO=Cl#P=F=BBr=NC=BrS#F=BrC#I#P=I=Br#BrClI=SP=F=OO#SBrI#Br=C#B=I=N#IBrI=Br=Br#B=O=Br=FN=FS=B=BF#NSOC#O#O=Br=FNNC=ONC#Cl#Cl=S#Br#BrI#CClI#B=S=F#IBr#Br#SC#CCl#C=BF=Br#Cl#FB=SCl=CONOBr#P#Cl=P#ClNB#Cl=BS#NCF=I=S#Br=O=C=OB#N=P=C#F#I=N#Cl=N#Cl=SPF=BC=Cl#S=S#I#B=C=F=I=PBClI=CN#ClF#S#N=S=BBr#ICl#N=BI#N=N#SI=ClSP=S=IBr=O=CP=Cl=B#N#II=O#PBr#S#NICl=IB=S#BrIP=S#ClS#ClC#Cl=P=BrF#Br#N#BSP#IFBrI#B=Cl#C#O#C=OP#Br#CN#B#S#ClP#BrCN#C#I#I=I=N=BrCl=NC#BrS#F=NO=PIPS=P=N=ClP#I#ClBrFBr=ClN#Br=IO=ICl=PI#SI=OI#PSI#IF=SPO=O#C=BP#CO=P#NFO=PBr#B=N#BrFB#I=NS#SNB=CS=Cl=B=I=Cl=S=F=B=F#P#ClFNFBrO#O#F#Cl=SBr=S=Cl#P#S=CBr#F=F=OF=P=P=ClB#Cl=S=OBr#N#BCl=C=OF=Cl=I=S#ClF#B#B#N#BrP#S#P=F#S#B#PB=F#Cl#NCl#O=S#ClO=N=F=PFF=S#Br=Br#S#Cl=C#I#S#FBr#Br#O#F=S#ClF#O#S#BrBr=Br=B#Br=Cl#B=F=S#IF#P#CCl#FBr#PS#C',
  165)]

Ahora que tengo mis datos, debo definir como transformarlos a cosas que me sirvan al igual que hice con las letras de las canciones


In [7]:
def transformar_entrada(molecula):
    return sum(1 for i in range(len(molecula)) if molecula.startswith("C=C", i))

In [8]:
transformar_entrada("C=C")


Out[8]:
1

In [9]:
transformar_entrada("C=C=C")


Out[9]:
2

In [10]:
tabla2 = []

In [11]:
for molecula,temperatura in tabla:
    transformado = transformar_entrada(molecula)
    tabla2.append((transformado,temperatura))

Checkeo si los valores se transformaron correctamente


In [12]:
random.sample(tabla2,10)


Out[12]:
[(5, 214),
 (3, 103),
 (3, 473),
 (3, 115),
 (1, 434),
 (0, 428),
 (1, 165),
 (1, 435),
 (7, 32),
 (1, 189)]

In [13]:
mediciones = {}
for cantidad,temperatura in tabla2:
    mediciones[cantidad] = mediciones.get(cantidad,[])
    mediciones[cantidad].append(temperatura)

Como son muchos datos, la mejor forma de visualizarlos seria graficandolos. Ejemplo de una muy mala forma de graficar los datos:


In [14]:
eje_x = []
eje_y = []

for cantidad in mediciones:
    for temperatura in mediciones[cantidad]:
        eje_x.append(cantidad)
        eje_y.append(temperatura)

In [15]:
import plotly.offline as py
import plotly.graph_objs as go

py.init_notebook_mode(connected=True)



In [16]:
trace = go.Scatter(
    x =  eje_x,
    y =  eje_y,
    mode = 'lines',
   name = "Cantidad Vs Temperatura"
)

py.iplot([trace])


Esta es una muy mala visualizacion para este tipo de datos. De este tipo de cosas dependen muchas veces la seriedad de los informes presentados. Un ejemplo bien claro de lo que no hay que hacer seria este informe, donde se demuestra que las herramientas no sirven si no son bien usadas.